package br.com.locasis.funcionalidades;

import java.util.ArrayList;
import java.util.List;

import javax.faces.model.SelectItem;
import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.international.StatusMessage.Severity;
import org.jboss.seam.international.StatusMessages;

import br.com.locasis.entity.Automovel;
import br.com.locasis.entity.TabelaValor;
import br.com.locasis.entity.TabelaValorAutomovel;
import br.com.locasis.utilitarios.Combustiveis;

@Name("cadastrarAutomovel")
@Scope(ScopeType.CONVERSATION)
// @Restrict(value="#{identity.hasRole('"+PerfilUsuario.PERFIL_PETSHOP+"')}")
public class CadastrarAutomovel {

	@In(create = true)
	private EntityManager entityManager;
	
	@In(value = "statusMessages")
	protected StatusMessages messages;

	private Automovel automovelEdicao;

	private List<Automovel> listaAutomoveis;

	private List<SelectItem> listaTabelas;

	private List<TabelaValorAutomovel> listaValores;

	private Integer idTabelaSelecionada;

	@Out(required = false)
	private Automovel automovelSelecionado;

	private boolean selecionadoTodos;

	private TabelaValor tabelaEdicao;

	private TabelaValorAutomovel valorEdicao;

	private boolean exibePopupNovoValor;

	private boolean exibePopupNovaTabela;
	
	private Integer idCombustivelSelecionado;
	
	private List<SelectItem> listaCombustiveis;

	public Integer getIdCombustivelSelecionado() {
		return idCombustivelSelecionado;
	}

	public void setIdCombustivelSelecionado(Integer idCombustivelSelecionado) {
		this.idCombustivelSelecionado = idCombustivelSelecionado;
	}

	public List<SelectItem> getListaCombustiveis() {
		if (listaCombustiveis == null) {
			listaCombustiveis = new ArrayList<SelectItem>();
			listaCombustiveis.add(new SelectItem(null,"Selecione"));
			listaCombustiveis.add(new SelectItem(Combustiveis.GASOLINA.getId(),Combustiveis.GASOLINA.getDescricao()));
			listaCombustiveis.add(new SelectItem(Combustiveis.ALCOOL.getId(),Combustiveis.ALCOOL.getDescricao()));
			listaCombustiveis.add(new SelectItem(Combustiveis.FLEX.getId(),Combustiveis.FLEX.getDescricao()));
			listaCombustiveis.add(new SelectItem(Combustiveis.DIESEL.getId(),Combustiveis.DIESEL.getDescricao()));
			listaCombustiveis.add(new SelectItem(Combustiveis.GNV.getId(),Combustiveis.GNV.getDescricao()));
			listaCombustiveis.add(new SelectItem(Combustiveis.TETRAFUEL.getId(),Combustiveis.TETRAFUEL.getDescricao()));
		}
		return listaCombustiveis;
	}

	public void setListaCombustiveis(List<SelectItem> listaCombustiveis) {
		this.listaCombustiveis = listaCombustiveis;
	}

	public boolean isExibePopupNovoValor() {
		return exibePopupNovoValor;
	}

	public void setExibePopupNovoValor(boolean exibePopupNovoValor) {
		this.exibePopupNovoValor = exibePopupNovoValor;
	}

	public boolean isExibePopupNovaTabela() {
		return exibePopupNovaTabela;
	}

	public void setExibePopupNovaTabela(boolean exibePopupNovaTabela) {
		this.exibePopupNovaTabela = exibePopupNovaTabela;
	}

	public TabelaValor getTabelaEdicao() {
		if (tabelaEdicao == null) {
			tabelaEdicao = new TabelaValor();
		}
		return tabelaEdicao;
	}

	public void setTabelaEdicao(TabelaValor tabelaEdicao) {
		this.tabelaEdicao = tabelaEdicao;
	}

	public TabelaValorAutomovel getValorEdicao() {
		if (valorEdicao == null) {
			valorEdicao = new TabelaValorAutomovel();
		}
		return valorEdicao;
	}

	public void setValorEdicao(TabelaValorAutomovel valorEdicao) {
		this.valorEdicao = valorEdicao;
	}

	public Integer getIdTabelaSelecionada() {
		return idTabelaSelecionada;
	}

	public void setIdTabelaSelecionada(Integer idTabelaSelecionada) {
		this.idTabelaSelecionada = idTabelaSelecionada;
	}

	public List<SelectItem> getListaTabelas() {
		if (listaTabelas == null) {
			listaTabelas = new ArrayList<SelectItem>();
			listaTabelas.add(new SelectItem(null, "Selecione"));
			List<TabelaValor> lista = entityManager.createQuery(
					"select t from TabelaValor t where t.flgAtivo is true")
					.getResultList();
			for (TabelaValor t : lista) {
				listaTabelas.add(new SelectItem(t.getIdTabelaValor(), t
						.getDscTabela()));
			}
		}
		return listaTabelas;
	}

	public void setListaTabelas(List<SelectItem> listaTabelas) {
		this.listaTabelas = listaTabelas;
	}

	public List<TabelaValorAutomovel> getListaValores() {
		if (listaValores == null) {
			listaValores = new ArrayList<TabelaValorAutomovel>();
		}
		return listaValores;
	}

	public void setListaValores(List<TabelaValorAutomovel> listaValores) {
		this.listaValores = listaValores;
	}

	public Automovel getAutomovelEdicao() {
		if (automovelEdicao == null) {
			automovelEdicao = new Automovel();
		}
		return automovelEdicao;
	}

	public void setAutomovelEdicao(Automovel automovelEdicao) {
		this.automovelEdicao = automovelEdicao;
	}

	public List<Automovel> getListaAutomoveis() {
		if (listaAutomoveis == null) {
			listaAutomoveis = entityManager.createQuery(
					"select a from Automovel a where a.flgAtivo is true")
					.getResultList();
		}
		return listaAutomoveis;
	}

	public void setListaAutomoveis(List<Automovel> listaAutomoveis) {
		this.listaAutomoveis = listaAutomoveis;
	}

	public boolean isSelecionadoTodos() {
		return selecionadoTodos;
	}

	public void setSelecionadoTodos(boolean selecionadoTodos) {
		this.selecionadoTodos = selecionadoTodos;
	}

	public void selecionaTodos() {
		for (Automovel a : getListaAutomoveis()) {
			if (isSelecionadoTodos()) {
				a.setSelecionado(true);
			} else {
				a.setSelecionado(false);
			}
		}
	}

	public void onLoad() {
		setListaAutomoveis(null);
		if (automovelSelecionado != null) {
			automovelEdicao = automovelSelecionado;
			listaValores = entityManager
				.createQuery(
					"select t from TabelaValorAutomovel t where t.automovel.idAutomovel = :id and flgAtivo is true")
				.setParameter("id", automovelSelecionado.getIdAutomovel())
				.getResultList();
		}else{
			setListaValores(new ArrayList<TabelaValorAutomovel>());
		}
	}

	public void onLoadList() {
		setAutomovelEdicao(null);
		setIdCombustivelSelecionado(null);
		automovelSelecionado = null;
	}

	public void salvarNovaTabela() {
		getTabelaEdicao().setFlgAtivo(true);
		TabelaValor tabelaSalva = entityManager.merge(getTabelaEdicao());
		getListaTabelas().add(
				new SelectItem(tabelaSalva.getIdTabelaValor(), tabelaSalva
						.getDscTabela()));
		setListaTabelas(null);
		setExibePopupNovaTabela(false);
	}

	public void adicionarValorAutomovel() {
		getValorEdicao()
				.setTabelaValor(
						entityManager.find(TabelaValor.class,
								getIdTabelaSelecionada()));
		for (TabelaValorAutomovel t : getListaValores()) {
			if (t.getTabelaValor().getDscTabela()
					.equals(getValorEdicao().getTabelaValor().getDscTabela())) {
				messages.add(Severity.ERROR,
						"Já existem valores para esta tabela cadastrados.");
				return;
			}
		}
		getListaValores().add(getValorEdicao());
		setValorEdicao(null);
		setExibePopupNovoValor(false);
	}

	public void inicializaPopupNovoValor() {
		setExibePopupNovoValor(true);
		setValorEdicao(null);
	}

	public void inicializaPopupNovaTabela() {
		setExibePopupNovaTabela(true);
		setTabelaEdicao(null);
	}

	public void cancelarNovoValor() {
		setExibePopupNovoValor(false);
	}

	public void cancelarNovaTabela() {
		setExibePopupNovaTabela(false);
	}

	@SuppressWarnings("unchecked")
	public String salvar() {
		List<TabelaValorAutomovel> valoresSalvos = new ArrayList<TabelaValorAutomovel>();
		if (getAutomovelEdicao().getIdAutomovel() != null) {
			valoresSalvos = entityManager
					.createQuery(
							"select t from TabelaValorAutomovel t where t.automovel.idAutomovel = :id and flgAtivo is true")
					.setParameter("id", getAutomovelEdicao().getIdAutomovel())
					.getResultList();
		}
		getAutomovelEdicao().setFlgAtivo(true);
		getAutomovelEdicao().setCombustivel(Combustiveis.recuperaDescricaoPorId(getIdCombustivelSelecionado()));
		if (getAutomovelEdicao().getPlaca() != null) {
			getAutomovelEdicao().setPlaca(getAutomovelEdicao().getPlaca().toUpperCase());
		}
		entityManager.persist(getAutomovelEdicao());
		Automovel automovelSalvo = getAutomovelEdicao();
		if(valoresSalvos != null){
			for (TabelaValorAutomovel t : getListaValores()) {
				boolean isSalvo = false;
				for (TabelaValorAutomovel vs : valoresSalvos) {
					if(t.getTabelaValor().getIdTabelaValor() == vs.getTabelaValor().getIdTabelaValor()){
						vs.setValorDiaria(t.getValorDiaria());
						vs.setValorHora(t.getValorHora());
						vs.setValorKm(t.getValorKm());
						entityManager.merge(vs);
						isSalvo = true;
						break;
					}
				}
				if(!isSalvo){
					t.setAutomovel(automovelSalvo);
					t.setFlgAtivo(true);
					entityManager.merge(t);
				}
			}
		}
		entityManager.flush();
		messages.add(Severity.INFO,
				"Frota cadastrada com sucesso.");
		setAutomovelEdicao(null);
		setIdCombustivelSelecionado(null);
		return "persisted";
	}

	public void excluirValor(TabelaValorAutomovel valor) {
		valor.setFlgAtivo(false);
		entityManager.merge(valor);
		entityManager.flush();
		getListaValores().remove(valor);
		messages.add(Severity.INFO,"Registro excluído com sucesso.");
		
	}

	public String cancelar() {
		setAutomovelEdicao(null);
		return "voltar";
	}

	public void excluir() {
		List<Automovel> listaRemocao = new ArrayList<Automovel>();
		for (Automovel a : getListaAutomoveis()) {
			if (a.isSelecionado()) {
				a.setFlgAtivo(false);
				entityManager.merge(a);
				listaRemocao.add(a);
			}
		}
		getListaAutomoveis().removeAll(listaRemocao);
		entityManager.flush();
		messages.add(Severity.INFO,
				"Automóvel(eis) excluído(s) com sucesso.");
	}

	public String novo() {
		return "novo";
	}

	public String editar(Automovel automovel) {
		automovelSelecionado = automovel;
		setIdCombustivelSelecionado(Combustiveis.recuperaIdPorDescricao(automovel.getCombustivel()));
		return "editar";
	}
}
